Unmap shadow vtable when freeing shadow table in free_shadow_pages().
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 13 Apr 2006 09:12:16 +0000 (10:12 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 13 Apr 2006 09:12:16 +0000 (10:12 +0100)
Signed-off-by: Xin Li <xin.b.li@intel.com>
xen/arch/x86/shadow32.c
xen/arch/x86/shadow_public.c

index 0af335f6237ec647f0c22f57f55d80b825480ff7..458bb99555239ac762fe6dca613f1cf02719b838 100644 (file)
@@ -583,6 +583,13 @@ static void free_shadow_pages(struct domain *d)
         {
             put_shadow_ref(pagetable_get_pfn(v->arch.shadow_table));
             v->arch.shadow_table = mk_pagetable(0);
+
+            if ( shadow_mode_external(d) )
+            {
+                if ( v->arch.shadow_vtable )
+                    unmap_domain_page_global(v->arch.shadow_vtable);
+                v->arch.shadow_vtable = NULL;
+            }
         }
 
         if ( v->arch.monitor_shadow_ref )
index 58edcb552a76ebdcce2df096509abf3239dfb41f..eee8fadb3eae2238968a1e285e7cbf012317d83e 100644 (file)
@@ -898,6 +898,13 @@ void free_shadow_pages(struct domain *d)
         {
             put_shadow_ref(pagetable_get_pfn(v->arch.shadow_table));
             v->arch.shadow_table = mk_pagetable(0);
+
+            if ( shadow_mode_external(d) )
+            {
+                if ( v->arch.shadow_vtable )
+                    unmap_domain_page_global(v->arch.shadow_vtable);
+                v->arch.shadow_vtable = NULL;
+            }
         }
 
         if ( v->arch.monitor_shadow_ref )